﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MotionControl;
using System.Threading;

namespace MainFrame
{
    public class GlobalVar
    {
        //2022-03-02
        //public static int[] alarmLight_ioPort = new int[] { 10, 11, 12, 13 };//三色灯红黄绿蜂鸣器端口地址

        #region 数据库相关
        //数据库相关
        public static string dbPassword = "";//权限管理数据库操作密码
        public static string dbName = "User.db";//权限管理数据库名称
        public static DB_base dbOperate = new sqliteHelper(dbName, dbPassword);//初始化权限管理数据库
        public static string tableName = "UserInfo";//权限管理表名称
        public static string[] tableCols = new string[] { "UserName", "Password", "Level" };//权限管理列名称数组
        public static string[] tableTypes = new string[] { "TEXT", "TEXT", "TEXT" };//列名称类型数组

        #endregion

        #region 界面更新相关
        //这些公用的静态变量，是会产生线程安全问题的（静态变量共用内存地址）--
        //多线程间调用时，并没有加lock锁的原因是：线程更新比较快，而变量值的改变--
        //却不是很快，所以不会出现不可控的情况（线程不安全不会报错，只是会产生非预期的结果）
        //可以加 volatile 关键字 保证始终读取的是最新值 （本程序没有加）
        //界面更新信息
        public static volatile bool isHardStart = false;//硬件是否启动
        public static volatile bool isDoorOpen = false;//门是否打开
        public static volatile bool isDoorEnable = true;//门开关是否启用
        public static volatile bool isAutoRun = false;//是否在工作状态

        public static volatile bool isStep = false;//自动连续运行还是单步
        public static volatile bool isStepNext = false;//单步运行的下一步
        public static volatile int stepNo = 0;//单步运动序号
        public static volatile bool isEstop = false;//急停
        public static volatile bool isGiveUp = false;//放弃操作
        public static volatile bool isPause = false;//暂停操作
        public static volatile bool isHome = false;//回原操作

        public static volatile bool isAlarmPopup = false;//警告弹窗是否弹出


        public static volatile bool isCanMotion = !GlobalVar.isEstop && !GlobalVar.isGiveUp && !GlobalVar.isHome && !GlobalVar.isPause && !GlobalVar.isExit;

        public static volatile int FormInfoT_time = 5000;//界面更新线程超时时间

        public static  double LastCircleTime = 0.0;//上轮耗时
        public static volatile int completeNum = 0;//完成的数量
        public static volatile int setupNum = 20000;//设置的目标数
        #endregion

        #region 型号/标定 数据全局变量
        public static typeData typedata_g = new typeData();
        public static AutoLoad autoload = new AutoLoad();
        public static List<CalibrationData> calibData_L=new List<CalibrationData>(3); //标定全局变量列表，列表对应不同的相机
        //public static StatisticsNumber statisticsInfo = new StatisticsNumber();
        #endregion
        //提示窗口对应成品变量
        public static volatile warningErrorInfo[] warningTips = new warningErrorInfo[5];//警告弹窗对应的5个成员 0-4 对应warningType        
        public static volatile warningErrorInfo[] errorTips = new warningErrorInfo[8];//错误弹窗对应的8个成员，0-7对应errorType

        public static bool isExit = false;//退出程序或退出自动运行

        public static volatile bool isUpdateCamSerial = false;//是否更新工位对应的相机序列号

        public static volatile double[] FweldVisonResult = new double[3];//0为匹配分数，1为X坐标，2为Y坐标
        public static volatile double[] LweldVisonResult = new double[3];//0为匹配分数，1为X坐标，2为Y坐标
        public static volatile double[] MeasureVisonResult = new double[5];//依次为中心-上，中心-下，中心-左，中心-右，右-FPC

        public static volatile List<bool> NGlist = new List<bool>();//NG列表 
        public static volatile bool isCurrentNG_F = false;//当前前焊接位是否是NG产品
        public static volatile bool isCurrentNG_L = false;//当前后焊接位是否是NG产品
        public static volatile bool isCurrentNG_M = false;//当前尺寸测量位是否是NG产品
        public static volatile int NGnumberContinual = 0;//NG数量
        public static volatile int NGnumberTotal = 0;//NG数量

        public static volatile bool typeDataOK = false;//型号数据准备好
        public static volatile bool isChangeType = false;//是否要换型号，即窗口上的收料
        public static volatile int onlyPullAMtimes = 200;//收料时，空拉料的次数

        public static volatile bool isToWeldOK_F = false; //是否正常到前焊接位（包括视觉）
        public static volatile bool isToWeldOK_L = false; //是否正常到后焊接位（包括视觉）

        public static volatile bool isToWeldTimeout_F = false; //前焊接视觉检测是否正常
        public static volatile bool isToWeldTimeout_L = false; //后焊接视觉检测是否正常
        public static volatile bool isMeasureTimeout = false; //尺寸测量视觉检测是否正常

        public static ManualResetEvent autoMRE = new ManualResetEvent(true);

        public static volatile bool isProcessCompleteF = false;//前焊接位图像处理是否完成
        public static volatile bool isProcessCompleteL = false;//后焊接位图像处理是否完成
        public static volatile bool isProcessCompleteM = false;//尺寸测量位图像处理是否完成

        public const  double paperPerDistance = 24.086;//拉砂纸的速度 24.086mm/s
        public const int ToPositionTimeOut = 5000;//到位超时
        public const double lessIgnoreValue = 0.1;//到位超时
        public static string CSVpath;//数据保存路径

        public static bool isROIdisplay = false;//更改ROI控件值，是否可显示

        public static int turnPlateIOnumber = 0;//转盘IO检测次数

        public static volatile bool isNeedResuck = false;//是否需要重吸
        public static volatile bool isCandLVacumm = false;//校正贴合真空状态
        public static int resuckNumber = 0;//当前重吸次数

        public static volatile bool isFirstDown = true;//第一次下来校正

        public static volatile bool isMagneticRising = false;//磁片升降，S轴正限位不报警

        public static int turnplateNO = 0;//转盘当前工位，共6个工位，如果6个工位都检测不到料，报警

        public static volatile bool isNextCircle = false;//是否可开始下一个循环，比如是否可以贴料，更新界面等

        public static volatile bool frontStationHave = false;//转盘前一个工位是否检测到有料

        public static volatile bool isPosiveZ = false;//触磁Z轴正限位

        public static volatile bool isChangeUser = false;//切换帐户

        public static frm_MainFrame frmMain;//主界面窗口

        public static volatile bool isNoProc = false;//暂停过程中，当前过程有没有处理完

        public static volatile bool isLotsOfAM = false;//检测到满料，后机台处理不过来，需要停机
        public static volatile bool checkIsLotsOfAM = true;//是否检测满料

        public static volatile int doorCount = 0;//门开关计数

        public static volatile bool isAutoRunThreadTips = false;//自动运行线程是否提示

        public static volatile int currentCirclePullNumber = 0;//当前循环计数值，用于收料和撕膜感应统计（拉料在指定次数内，感应器没有变化，则认为是无料或满料）
        public static volatile int currentCircleTakeNumber = 0;//当前循环计数值，用于收料和撕膜感应统计（拉料在指定次数内，感应器没有变化，则认为是无料或满料）
        //public static volatile int currentCircleTakeNumber_Front = 0;
        public static volatile int currentCircleTakeNumber_BackMany = 0;
        public static volatile int currentCircleTakeNumber_BackMore = 0;
        public static volatile bool isHaveAlarm = false;//是否有报警

        public static volatile bool isAdjustPosSignal = false;//校正平台是否有料

        public static volatile bool isStartPullYes = false;
        public static volatile bool isStartPullNo = false;
        /// <summary>
        /// 警告弹窗对应的类型
        /// </summary>
        public enum warningType
        {
            noData=0,
            changeAM,
            changeSandPaper,
            sucker,
            complete
        }
        /// <summary>
        /// 错误弹窗对应的类型
        /// </summary>
        public enum errorType
        {
            axisError = 0,
            threadError,
            weldError,
            cylinderError,
            homeError,
            imageError,
            needTakeAM,
            softEstop
        }
        /// <summary>
        /// 单步执行名称
        /// </summary>
        public enum stepName
        {
            MagneticRise=0,
            GetMagnetic,
            CorrectMagnetic,
            LaminateMagnetic,
            TakeFilm,
            OnlyPull
        }

      
    }
    public enum e_light_IO
    {
        red = 10,
        yellow = 11,
        green = 12,
        beef = 13
    }
}
